/*
 * Copyright 2025 The JA-SIG Collaborative. All rights reserved.
 * distributed with this file and available online at
 */
package com.lap.auth.application.menu;

import com.lap.auth.domain.menu.repository.MenuApiRepository;
import com.lap.auth.domain.menu.service.MenuValidator;
import com.lap.auth.domain.menu.valueobject.MenuApi;
import java.util.List;
import java.util.Set;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 菜单和资源关系应用服务层
 *
 * <ol>
 *   <li>不做业务规则，只做技术规则（加密/解密是技术实现，业务不关注）
 *   <li>取数，赋值，对象转换在这层执行
 *   <li>命名有规范，动词+领域名字
 *   <li>如查询比较多，建议分开领域QueryAppService,如:分页查询，分页查询返回关联字段
 * </ol>
 */
@RequiredArgsConstructor
@Service
public class MenuApiAppService {

  private final MenuValidator menuValidator;
  private final MenuApiRepository menuApiRepository;

  @Transactional(rollbackFor = Exception.class)
  public void replaceMenuApis(Integer menuId, Set<String> apiSet) {
    menuValidator.assertMenuExists(menuId);
    menuApiRepository.deleteByMenuId(menuId);
    if (CollectionUtils.isNotEmpty(apiSet)) {
      List<MenuApi> relations = apiSet.stream().map(code -> new MenuApi(menuId, code)).toList();
      menuApiRepository.saveAll(relations);
    }
  }

  public List<String> queryMenuApisByMenuId(Integer menuId) {
    menuValidator.assertMenuExists(menuId);
    return menuApiRepository.findByMenuId(menuId);
  }
}
